home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / utilities / misc / qmouse-2.02.lzh / qmouse.s < prev   
Text File  |  1992-02-22  |  28KB  |  1,416 lines

  1. ;QMouse.s
  2. ;Written by Dan Babcock
  3.  
  4. ;Note: This source was assembled with Macro68. If you don't have Macro68
  5. ;(shame) it may be easily modified for use under A68K.
  6.  
  7.     exeobj
  8.     objfile    'c:QMouse'
  9.  
  10.     IFND    _LVOSystemTagList
  11. _LVOSystemTagList    equ    -$25E
  12.     ENDC
  13.  
  14. SCREENLISTSIZE    equ    32    ;maximum number of screens to keep track of
  15. POINTERLISTSIZE    equ    32
  16. HANDLERPRI    equ    60    ;priority of input.device handler
  17. MaxCopperSize    equ    500
  18.  
  19. SysBackground    equ    $e    ;Offset into gb_copinit copper list -- 2.04 only!
  20. DefColor    equ    $fff    ;white
  21.  
  22.     move.l    4,a6
  23.     cmp.w    #37,LIB_VERSION(a6)
  24.     bhs.s    .GoodVer
  25.     lea    Sorry(pc),a0
  26.     bsr.s    Print
  27.     moveq    #100,d0
  28.     rts
  29.  
  30. .GoodVer:
  31. ;Allocate global data structure
  32.     move.l    #Data_Sizeof,d0
  33.     move.l    #MEMF_CLEAR,d1
  34.     SYS    AllocMem
  35.     tst.l    d0
  36.     bne    AllocOK
  37.     rts
  38.  
  39. Print:
  40. ;Output a string to the CLI
  41. ;Enter with pointer to a zero-terminated string in a0
  42. ;All registers are preserved
  43.  
  44.     movem.l    d0-d7/a0-a6,-(sp)
  45.     move.l    a0,a5
  46.     lea    DosName(pc),a1
  47.     move.l    4,a6
  48.     SYS    OldOpenLibrary
  49.     tst.l    d0
  50.     beq.s    .End
  51.     move.l    d0,a6
  52.     move.l    a5,a0
  53.     move.l    a5,a4
  54. .PrintLine:
  55.     tst.b    (a5)+
  56.     bne    .PrintLine
  57.     subq.l    #1,a5
  58.     sub.l    a0,a5
  59.     SYS    Output
  60.     move.l    d0,d1  
  61.     move.l    a4,d2
  62.     move.l    a5,d3
  63.     SYS    Write
  64.     move.l    a6,a1
  65.     move.l    4,a6
  66.     SYS    CloseLibrary
  67. .End:    movem.l    (sp)+,d0-d7/a0-a6
  68.     rts
  69.  
  70.     dc.b    '$VER: QMouse V2.02 (22.2.92)',$a,0
  71. Sorry:    dc.b    'Sorry, this program requires Kickstart 2.0!',$a,0
  72.     even
  73.  
  74. AllocOK:
  75.     move.l    d0,a5
  76.     lea    GlobalPtr(pc),a0
  77.     move.l    a5,(a0)
  78.  
  79. ;Allocate chip RAM data.
  80.     move.l    #CData_Sizeof,d0
  81.     move.l    #MEMF_CLEAR+MEMF_CHIP,d1
  82.     SYS    AllocMem
  83.     move.l    d0,ChipData(a5)
  84.     beq    CleanUp
  85.  
  86. ;Initialize static data
  87.     move.b    #HANDLERPRI,InputInterrupt+LN_PRI(a5)
  88.     move.l    a5,InputInterrupt+IS_DATA(a5)
  89.     moveq    #1,d0
  90.     move.l    d0,ClickCount(a1)
  91.  
  92. ;Open dos.library
  93.     lea    DosName(pc),a1
  94.     SYS    OldOpenLibrary
  95.     move.l    d0,DosBase(a5)
  96.     beq    CleanUp
  97.  
  98. ;Parse command line
  99.     lea    Template(pc),a0
  100.     move.l    a0,d1
  101.     lea    Options(a5),a0
  102.     move.l    a0,d2
  103.     moveq    #0,d3    ;no custom rdarg structure
  104.     move.l    DosBase(a5),a6
  105.     SYS    ReadArgs
  106.     move.l    d0,ArgPtr(a5)
  107.     beq    CleanUp
  108.     move.l    4,a6
  109.  
  110. ;Process QUIT option, if selected.
  111.     tst.l    QuitOption(a5)
  112.     beq.s    .SkipQuit
  113.     lea    ProcName(pc),a1
  114.     SYS    FindTask
  115.     tst.l    d0
  116.     beq    CleanUp
  117.     move.l    d0,a1
  118.     move.l    TC_Userdata(a1),d0
  119.     SYS    Signal    ;tell task to quit
  120.     bsr    CleanUp
  121.     bra    .Exit
  122. .SkipQuit:
  123.  
  124. ;If already installed, kill the existing process.
  125.     lea    ProcName(pc),a1
  126.     SYS    FindTask
  127.     tst.l    d0
  128.     beq.s    .NotInstalled
  129.     move.l    d0,a1
  130.     move.l    TC_Userdata(a1),d0
  131.     SYS    Signal    ;tell task to quit
  132.  
  133.     moveq    #26,d2
  134. .Kill:    subq.l    #1,d2
  135.     beq    .Exit
  136.     move.l    DosBase(a5),a6
  137.     moveq    #2,d1
  138.     SYS    Delay
  139.     lea    ProcName(pc),a1
  140.     move.l    4,a6
  141.     SYS    FindTask
  142.     tst.l    d0
  143.     bne    .Kill
  144. .NotInstalled:
  145.  
  146. ;Open intuition.library
  147.     lea    IntName(pc),a1
  148.     SYS    OldOpenLibrary
  149.     move.l    d0,IntBase(a5)
  150.     beq    CleanUp
  151.  
  152. ;Open graphics.library
  153.     lea    GraphName(pc),a1
  154.     SYS    OldOpenLibrary
  155.     move.l    d0,GraphBase(a5)
  156.     beq    CleanUp
  157.  
  158. ;Open layers.library
  159.     lea    LayersName(pc),a1
  160.     SYS    OldOpenLibrary
  161.     move.l    d0,LayersBase(a5)
  162.     beq    CleanUp
  163.  
  164. ;Get stack for command.
  165.     move.l    DosBase(a5),a6
  166.     SYS    Cli
  167.     move.l    d0,a0
  168.     move.l    cli_DefaultStack(a0),d0
  169.     lsl.l    #2,d0
  170.     lea    CmdStackSize(pc),a0
  171.     move.l    d0,(a0)
  172.     move.l    4,a6
  173.  
  174. ;Copy resident part of code into allocated memory
  175.     lea    StartAllocCode(pc),a0    ;source
  176.     lea    ResidentCode(a5),a1    ;destination
  177.     move.l    #ResidentCodeSize,d0    ;size
  178.     SYS    CopyMem
  179.     SYS    CacheClearU    ;for 020/030/040
  180.  
  181. ;Start a process
  182.     move.l    DosBase(a5),a6
  183.     lea    ResidentCode(a5),a0
  184.     lea    EntryPoint(pc),a1
  185.     move.l    a0,(a1)
  186.     lea    ProcName-StartAllocCode+ResidentCode(a5),a0
  187.     lea    ProcNamePtr(pc),a1
  188.     move.l    a0,(a1)
  189.     lea    NewProcTags(pc),a0
  190.     move.l    a0,d1
  191.     SYS    CreateNewProc
  192.  
  193. ;Exit back to CLI
  194. .Exit:    moveq    #0,d0
  195.     rts
  196.  
  197. ***************************************************************************
  198. * The following code is copied into allocated memory.                     *
  199. ***************************************************************************
  200.  
  201. StartAllocCode:
  202.     move.l    4,a6
  203.     move.l    GlobalPtr(pc),a5
  204.     lea    IntRoutine(pc),a0
  205.     move.l    a0,InputInterrupt+IS_CODE(a5)
  206.  
  207. ;Initialize damping constant.
  208.     move.l    AccelOption(a5),d0
  209.     beq.s    .NoDamp
  210.     move.l    d0,a0
  211.     move.l    (a0),d0
  212.     subq.l    #1,d0
  213.     move.l    ThreshOption(a5),d1
  214.     beq.s    .DefThresh
  215.     move.l    d1,a0
  216.     move.l    (a0),d1
  217. .DefThresh:
  218.     addq.l    #1,d1
  219.     mulu.w    d0,d1
  220.     move.w    d1,DampingConstant(a5)
  221. .NoDamp:
  222.  
  223. ;Allocate signals
  224.     moveq    #NumSigs-1,d2
  225.     lea    Sigs(a5),a2
  226. .SigLoop:    moveq    #-1,d0
  227.     SYS    AllocSignal
  228.     tst.l    d0
  229.     bmi    CleanUp
  230.     moveq    #0,d1
  231.     bset    d0,d1
  232.     move.l    d1,(a2)+
  233.     dbra    d2,.SigLoop
  234.  
  235. ;Initialize semaphore(s)
  236.     lea    MySemaphore(a5),a0
  237.     SYS    InitSemaphore
  238.  
  239.     move.l    ThisTask(a6),a0
  240.     move.l    a0,Task(a5)
  241.     move.l    QuitSig(a5),TC_Userdata(a0)
  242.  
  243. ;Install no-flicker option if selected.
  244.     tst.l    FlickerOption(a5)
  245.     beq.s    .NoFlicker
  246.     move.l    GraphBase(a5),a0
  247.     move.l    gb_CopInit(a0),a0
  248.     move.l    a0,OriginalCopInit(a5)
  249.     move.l    ChipData(a5),a1
  250.     lea    Copper(a1),a1
  251.     move.l    a1,a2
  252.     move.w    #MaxCopperSize/4-1,d0
  253. .CLoop:    move.l    (a0)+,d1
  254.     cmp.l    #$008A0000,d1
  255.     beq.s    .CopEnd
  256.     move.l    d1,(a1)+
  257.     dbra    d0,.CLoop
  258.     clr.l    FlickerOption(a5)
  259.     bra.s    .NoFlicker
  260. .CopEnd:    move.l    #$01800000,(a1)+
  261.     move.l    #$1607FFFE,(a1)+
  262.     move.w    #$0180,(a1)+
  263.     move.l    #$008A0000,2(a1)
  264.     move.l    a1,RealBackground(a5)
  265.     move.l    a2,cop1lc+_custom
  266.     move.l    GraphBase(a5),a0
  267.     move.l    a2,gb_CopInit(a0)
  268.     cmp.w    #color,SysBackground-2(a2)
  269.     bne.s    .DefColor
  270.     move.w    SysBackground(a2),(a1)
  271.     bra.s    .NoFlicker
  272. .DefColor:
  273.     move.w    #DefColor,(a1)
  274. .NoFlicker:
  275.  
  276. ;Patch MANY system routines.
  277.     lea    PatchTable(pc),a2
  278.     move.l    a2,a3
  279. .Patch:    move.w    (a2)+,d0    ;get base
  280.     beq.s    .EndPatch
  281.     move.l    (a5,d0.w),a1    ;library base to patch
  282.     move.w    (a2)+,d0    ;get offset to new routine
  283.     lea    (a3,d0.w),a0
  284.     move.l    a0,d0    ;new routine address
  285.     move.w    (a2)+,a0    ;_LVO offset
  286.     SYS    SetFunction
  287.     move.w    (a2)+,d1
  288.     move.l    d0,(a5,d1.w)
  289.     bra    .Patch
  290. .EndPatch:
  291.  
  292. ;Create an IORequest structure
  293.     SYS    CreateMsgPort
  294.     move.l    d0,InputMsgPort(a5)
  295.     beq    CleanUp
  296.     move.l    d0,a0
  297.     moveq    #IOSTD_SIZE,d0
  298.     SYS    CreateIORequest
  299.     move.l    d0,InputIORequest(a5)
  300.     beq    CleanUp
  301.  
  302. ;Open the input.device
  303.     lea    InputName(pc),a0    ;device name
  304.     moveq    #0,d0    ;unit number
  305.     move.l    InputIORequest(a5),a1    ;IO request
  306.     moveq    #0,d1    ;flags
  307.     SYS    OpenDevice
  308.     tst.l    d0
  309.     bne    CleanUp
  310.  
  311. ;Install input handler
  312.     move.l    InputIORequest(a5),a1
  313.     move.w    #IND_ADDHANDLER,IO_COMMAND(a1)
  314.     lea    InputInterrupt(a5),a0
  315.     move.l    a0,IO_DATA(a1)
  316.     SYS    DoIO
  317.     tst.l    d0
  318.     bne    CleanUp
  319.     st    HandlerInstalled(a5)
  320.  
  321. ;Wait for signal(s)
  322. Wait:
  323.     lea    Sigs(a5),a0
  324.     move.l    (a0)+,d0
  325.     moveq    #NumSigs-2,d1
  326. ..    add.l    (a0)+,d0
  327.     dbra    d1,..
  328.     move.l    4,a6
  329.     SYS    Wait
  330.     move.l    d0,d1
  331.     and.l    QuitSig(a5),d1
  332.     bne.s    SafeCleanUp
  333.     move.l    d0,d1
  334.     and.l    CLISig(a5),d1
  335.     bne.s    .Execute
  336.     move.l    d0,d1
  337.     and.l    WBenchToFrontSig(a5),d1
  338.     bne.s    .WBenchToFront
  339.  
  340. ;Perform ScreenToBack
  341.     move.l    IntBase(a5),a6
  342.     move.l    ScreenPtr(a5),d0
  343.     beq    Wait
  344.     clr.l    ScreenPtr(a5)
  345.     move.l    d0,a0
  346.     SYS    ScreenToBack
  347.     bra    Wait
  348. .WBenchToFront:
  349.     move.l    IntBase(a5),a6
  350.     SYS    WBenchToFront
  351.     bra    Wait
  352. .Execute:
  353. ;Execute the desired command
  354.     move.l    DosBase(a5),a6
  355.  
  356.     move.l    CmdOption(a5),d1
  357.     beq    Wait
  358.     lea    .Tags(pc),a0
  359.     move.l    a0,d2    ;tags
  360.     SYS    SystemTagList
  361.     bra    Wait
  362. .Tags:    dc.l    SYS_USERSHELL,0
  363.     dc.l    NP_StackSize
  364. CmdStackSize:
  365.     dc.l    0
  366.     dc.l    0    ;end of tag list
  367.  
  368. SafeCleanUp:
  369. ;Make sure the SetFunction'ed vectors are still intact.
  370.     lea    PatchTable(pc),a0
  371.     move.l    a0,a2
  372. .Safe:    move.w    (a0)+,d0
  373.     beq.s    CleanUp
  374.     move.l    (a5,d0.w),a1    ;library base
  375.     move.w    (a0)+,d0
  376.     lea    (a2,d0.w),a3    ;address of new routine
  377.     move.w    (a0)+,d0
  378.     cmp.l    2(a1,d0.w),a3
  379.     bne    Wait
  380.     addq.l    #2,a0
  381.     bra    .Safe
  382.  
  383. CleanUp:
  384.  
  385. ;Enter with global ptr in A5
  386.  
  387.     move.l    4,a6
  388.  
  389. ;Remove input handler, if installed.
  390.     tst.b    HandlerInstalled(a5)
  391.     beq.s    .SkipHand
  392.     move.l    InputIORequest(a5),a1
  393.     move.w    #IND_REMHANDLER,IO_COMMAND(a1)
  394.     lea    InputInterrupt(a5),a0
  395.     move.l    a0,IO_DATA(a1)
  396.     SYS    DoIO
  397. .SkipHand:
  398.  
  399.     bsr    RestoreMouse
  400.     bsr    RestoreScreen
  401.  
  402. ;Restore original vectors.
  403.     tst.l    IntBase(a5)
  404.     beq.s    .SkipRestore
  405.     tst.l    OldCloseScreen(a5)
  406.     beq.s    .SkipRestore
  407.  
  408.     lea    PatchTable(pc),a2
  409. .RestoreVecs:
  410.     move.w    (a2),d0
  411.     beq.s    .SkipRestore
  412.     addq.l    #4,a2    ;skip new routine info
  413.     move.l    (a5,d0.w),a1    ;get library base
  414.     move.w    (a2)+,a0    ;get _LVO
  415.     move.w    (a2)+,d0
  416.     move.l    (a5,d0.w),d0    ;old routine
  417.     SYS    SetFunction
  418.     bra    .RestoreVecs
  419. .SkipRestore:
  420.  
  421. ;Delay for 1/10 second to ensure that no-one is using the patch code.
  422.     move.l    DosBase(a5),d0
  423.     beq.s    .SkipDelay
  424.     move.l    d0,a6
  425.     moveq    #5,d1
  426.     SYS    Delay
  427. .SkipDelay:
  428.  
  429. ;Free argument structure
  430.     tst.l    DosBase(a5)
  431.     beq.s    .SkipFreeArg
  432.     move.l    DosBase(a5),a6
  433.     move.l    ArgPtr(a5),d1
  434.     beq.s    .SkipFreeArg
  435.     SYS    FreeArgs
  436. .SkipFreeArg:
  437.  
  438.     move.l    4,a6
  439.  
  440. ;Free signals
  441.     lea    Sigs(a5),a2
  442.     moveq    #NumSigs-1,d2
  443. .SigLoop:    move.l    (a2)+,d1
  444.     beq.s    .NextSig
  445.     moveq    #-1,d0
  446. .BitLoop:    addq.l    #1,d0
  447.     btst    d0,d1
  448.     beq    .BitLoop
  449.     SYS    FreeSignal
  450. .NextSig:    dbra    d2,.SigLoop
  451.  
  452. ;Remove flicker option, if selected.
  453.     tst.l    FlickerOption(a5)
  454.     beq.s    .SkipFlicker
  455.     move.l    OriginalCopInit(a5),a0
  456.     move.l    GraphBase(a5),a2
  457.     move.l    gb_CopInit(a2),a1
  458. .CLoop:    move.l    (a1)+,(a0)+
  459.     cmp.l    #$008A0000,(a0)
  460.     bne    .CLoop
  461.     move.l    OriginalCopInit(a5),gb_CopInit(a2)
  462.     move.l    OriginalCopInit(a5),cop1lc+_custom
  463. .SkipFlicker:
  464.  
  465. ;Close intuition.library
  466.     move.l    IntBase(a5),d0
  467.     beq.s    .SkipCloseInt
  468.     move.l    d0,a1
  469.     SYS    CloseLibrary
  470. .SkipCloseInt:
  471.  
  472. ;Close graphics.library
  473.     move.l    GraphBase(a5),d0
  474.     beq.s    .SkipCloseGraph
  475.     move.l    d0,a1
  476.     SYS    CloseLibrary
  477. .SkipCloseGraph:
  478.  
  479. ;Close dos.library
  480.     move.l    DosBase(a5),d0
  481.     beq.s    .SkipCloseDos
  482.     move.l    d0,a1
  483.     SYS    CloseLibrary
  484. .SkipCloseDos:
  485.  
  486. ;Close layers.library
  487.     move.l    LayersBase(a5),d0
  488.     beq.s    .SkipCloseLayers
  489.     move.l    d0,a1
  490.     SYS    CloseLibrary
  491. .SkipCloseLayers:
  492.  
  493. ;Close input.device
  494.     move.l    InputIORequest(a5),d0
  495.     beq.s    .SkipCloseDev
  496.     move.l    d0,a1
  497.     tst.b    IO_ERROR(a1)    ;was there an error?
  498.     bne.s    .SkipCloseDev    ;yes, don't close
  499.     SYS    CloseDevice
  500. .SkipCloseDev:
  501.  
  502. ;Delete IORequest structure
  503.     move.l    InputMsgPort(a5),a0
  504.     SYS    DeleteMsgPort
  505.     move.l    InputIORequest(a5),a0
  506.     SYS    DeleteIORequest
  507.  
  508. ;Free chip data.
  509.     tst.l    ChipData(a5)
  510.     beq.s    .SkipChipData
  511.     move.l    ChipData(a5),a1
  512.     move.l    #CData_Sizeof,d0
  513.     SYS    FreeMem
  514. .SkipChipData:
  515.  
  516. ;Deallocate global structure. Note that this code is (sometimes) executed
  517. ;within the memory that we are freeing, so we are careful to terminate with
  518. ;a JMP.
  519.     move.l    a5,a1
  520.     move.l    #Data_Sizeof,d0
  521.     jmp    _LVOFreeMem(a6)
  522.  
  523. ;Semaphore routines
  524.  
  525. GetSemaphore:
  526.     movem.l    a0/a6,-(sp)
  527.     move.l    GlobalPtr(pc),a0
  528.     lea    MySemaphore(a0),a0
  529.     move.l    4,a6
  530.     SYS    ObtainSemaphore
  531.     movem.l    (sp)+,a0/a6
  532.     rts
  533. FreeSemaphore:
  534.     movem.l    a0/a6,-(sp)
  535.     move.l    GlobalPtr(pc),a0
  536.     lea    MySemaphore(a0),a0
  537.     move.l    4,a6
  538.     SYS    ReleaseSemaphore
  539.     movem.l    (sp)+,a0/a6
  540.     rts
  541.  
  542. ;****************** SetFunction'ed routines ***************
  543.  
  544. patch    macro
  545.     dc.w    \1
  546.     dc.w    New\2-PatchTable
  547.     dc.w    _LVO\2
  548.     dc.w    Old\2
  549.     endm
  550.  
  551. PatchTable:
  552.     patch    IntBase,CloseScreen
  553.     patch    IntBase,CloseWindow
  554.     patch    IntBase,OpenScreen
  555.     patch    IntBase,ScreenToFront
  556.     patch    IntBase,ScreenToBack
  557.     patch    IntBase,OpenScreenTagList
  558.     patch    IntBase,WBenchToFront
  559.     patch    IntBase,WBenchToBack
  560.     patch    IntBase,SetPointer
  561.     patch    IntBase,ClearPointer
  562.     patch    IntBase,DisplayBeep
  563.     patch    GraphBase,LoadView
  564.     dc.w    0
  565.  
  566. NewDisplayBeep:
  567.     move.l    GlobalPtr(pc),a1
  568.     tst.l    BeepOption(a1)
  569.     beq.s    .NormalBeep
  570.     rts
  571. .NormalBeep:
  572.     move.l    OldDisplayBeep(a1),-(sp)
  573.     rts
  574.  
  575. NewSetPointer:
  576.     bsr    GetSemaphore
  577.     movem.l    d4-d5/a2-a3/a5,-(sp)
  578.     move.l    GlobalPtr(pc),a5
  579.     lea    PointerList(a5),a2
  580.  
  581. ;Find if window is already in table and find empty spot.
  582.     moveq    #POINTERLISTSIZE-1,d4
  583.     sub.l    a3,a3
  584. .WinSearch:
  585.     move.l    pt_Window(a2),d5
  586.     bne.s    .SkipSave
  587.     move.l    a2,a3
  588. .SkipSave:
  589.     cmp.l    d5,a0
  590.     beq.s    .Found
  591.     lea    pt_Sizeof(a2),a2
  592.     dbra    d4,.WinSearch
  593.     move.l    a3,a2
  594.     move.l    a2,d4
  595.     beq.s    .End    ;no room in table, so forget it
  596. .Found:    movem.l    d0-d3/a0-a1,(a2)
  597. .End:    cmp.l    MBlankWindow(a5),a0
  598.     beq.s    .End1
  599. .SkipMBlank:
  600.     movem.l    (sp)+,d4-d5/a2-a3/a5
  601.     subq.l    #8,sp
  602.     move.l    a0,(sp)
  603.     move.l    GlobalPtr(pc),a0
  604.     move.l    OldSetPointer(a0),4(sp)
  605.     move.l    (sp)+,a0
  606.     bsr    FreeSemaphore
  607.     rts
  608. .End1:    movem.l    (sp)+,d4-d5/a2-a3/a5
  609.     bsr    FreeSemaphore
  610.     rts
  611.  
  612. NewClearPointer:
  613.     bsr    GetSemaphore
  614.     move.l    GlobalPtr(pc),a1
  615.     lea    PointerList(a1),a1
  616.     moveq    #POINTERLISTSIZE-1,d0
  617. .ClearLoop:
  618.     cmp.l    pt_Window(a1),a0
  619.     beq.s    .Found
  620.     lea    pt_Sizeof(a1),a1
  621.     dbra    d0,.ClearLoop
  622.     bra.s    .End
  623. .Found:    clr.l    pt_Window(a1)
  624. .End:    move.l    GlobalPtr(pc),a1
  625.     cmp.l    MBlankWindow(a1),a0
  626.     beq.s    .End1
  627. .SkipMBlank:
  628.     move.l    OldClearPointer(a1),-(sp)
  629. .End1:    bsr    FreeSemaphore
  630.     rts
  631.  
  632. NewLoadView:
  633.     pea    .NewLoad(pc)
  634.     move.l    GlobalPtr(pc),a0
  635.     move.l    OldLoadView(a0),-(sp)
  636.     rts
  637. .NewLoad:
  638.     move.l    GlobalPtr(pc),a0
  639.     tst.l    FlickerOption(a0)
  640.     beq.s    .End
  641.     move.l    RealBackground(a0),a1
  642.     move.l    GraphBase(a0),a0
  643.     move.l    gb_copinit(a0),a0
  644.     move.w    SysBackground(a0),(a1)
  645. .End:    rts
  646.  
  647. NewCloseScreen:
  648.     bsr    GetSemaphore
  649.     move.l    GlobalPtr(pc),a1
  650.     lea    ScreenList(a1),a1
  651.     moveq    #SCREENLISTSIZE-1,d0
  652. .Loop:    cmp.l    (a1),a0
  653.     beq.s    .Match
  654.     addq.l    #8,a1
  655.     dbra    d0,.Loop
  656. .End:    move.l    GlobalPtr(pc),a1
  657.     pea    RestoreWindow(pc)
  658.     move.l    OldCloseScreen(a1),-(sp)
  659.     bsr    FreeSemaphore
  660.     rts
  661. .Match:    clr.l    (a1)
  662.     bra    .End
  663.  
  664. NewCloseWindow:
  665.     bsr    GetSemaphore
  666.     push    a0
  667.     SYS    ClearPointer
  668.     pop    a0
  669.     move.l    GlobalPtr(pc),a1
  670.     cmp.l    MBlankWindow(a1),a0
  671.     bne.s    .SkipClear
  672.     clr.l    MBlankWindow(a1)
  673. .SkipClear:
  674.     lea    ScreenList+4(a1),a1
  675.     moveq    #SCREENLISTSIZE-1,d0
  676. .Loop:    cmp.l    (a1),a0
  677.     beq.s    .Match
  678.     addq.l    #8,a1
  679.     dbra    d0,.Loop
  680. .End:    move.l    GlobalPtr(pc),a1
  681.     move.l    OldCloseWindow(a1),-(sp)
  682.     bsr    FreeSemaphore
  683.     rts
  684. .Match:    clr.l    -4(a1)
  685.     bra    .End
  686.  
  687. MyRemember:
  688.     bsr    GetSemaphore
  689.     bsr.s    RememberWindow
  690.     move.l    a0,-(sp)
  691.     move.l    GlobalPtr(pc),a0
  692.     move.l    (a0,d0.w),d0
  693.     move.l    (sp)+,a0
  694.     move.l    d0,-(sp)
  695.     bsr    FreeSemaphore
  696.     rts
  697.  
  698. NewOpenScreen:
  699.     move.w    #OldOpenScreen,d0
  700.     bra    MyRemember
  701. NewOpenScreenTagList:
  702.     move.w    #OldOpenScreenTagList,d0
  703.     bra    MyRemember
  704. NewWBenchToFront:
  705.     move.w    #OldWBenchToFront,d0
  706.     bsr    MyRemember
  707.     bra.s    RestoreWindow
  708. NewWBenchToBack:
  709.     move.w    #OldWBenchToBack,d0
  710.     bsr    MyRemember
  711.     bra.s    RestoreWindow
  712. NewScreenToFront:
  713.     move.w    #OldScreenToFront,d0
  714.     bsr    MyRemember
  715.     bra.s    RestoreWindow
  716. NewScreenToBack:
  717.     move.w    #OldScreenToBack,d0
  718.     bsr    MyRemember
  719.     bra.s    RestoreWindow
  720.  
  721. ;****************** End of SetFunction'ed routines ***************
  722.  
  723. RememberWindow:
  724.  
  725. ;This routine remembers the currently activated window on the current
  726. ;screen.
  727.  
  728.     movem.l    d0-d1/a0-a2/a4-a6,-(sp)
  729.     move.l    GlobalPtr(pc),a5
  730.     move.l    IntBase(a5),a4
  731.     move.l    4,a6
  732.     SYS    Forbid
  733.     move.l    ib_ActiveScreen(a4),a0
  734.     move.l    ib_ActiveWindow(a4),a2
  735.     SYS    Permit
  736.  
  737. ;Sanity checks
  738.     move.l    a0,d0
  739.     beq.s    .End
  740.     move.l    a2,d0
  741.     beq.s    .End
  742.  
  743.     lea    ScreenList(a5),a1
  744.     moveq    #SCREENLISTSIZE-1,d0
  745. .ScLoop:    cmp.l    (a1),a0
  746.     beq.s    .Match
  747.     addq.l    #8,a1
  748.     dbra    d0,.ScLoop
  749.  
  750. ;Screen not found. Add to screen list.
  751.     lea    ScreenList(a5),a1
  752.     moveq    #SCREENLISTSIZE-1,d0
  753. .AddLoop:    tst.l    (a1)
  754.     beq.s    .Match
  755.     addq.l    #8,a1
  756.     dbra    d0,.AddLoop
  757.     bra.s    .End    ;table is full
  758. .Match:
  759.     move.l    a0,(a1)+    ;screen
  760.     move.l    a2,(a1)    ;currently activated window
  761. .End:    movem.l    (sp)+,d0-d1/a0-a2/a4-a6
  762.     rts
  763.  
  764. RestoreWindow:
  765.  
  766. ;This routine restores (re-activates) the previously activated window for
  767. ;this screen.
  768.  
  769.     bsr    GetSemaphore
  770.     movem.l    d0-d1/a0-a1/a6,-(sp)
  771.     move.l    GlobalPtr(pc),a0
  772.     lea    ScreenList(a0),a1
  773.     move.l    IntBase(a0),a6
  774.     move.l    ib_FirstScreen(a6),a0
  775.     move.l    a0,d0
  776.     beq.s    .End    ;sanity check
  777.     moveq    #SCREENLISTSIZE-1,d0
  778. .Loop:    cmp.l    (a1),a0
  779.     beq.s    .Match
  780.     addq.l    #8,a1
  781.     dbra    d0,.Loop
  782.     move.l    sc_FirstWindow(a0),a0    ;default window
  783.     move.l    a0,d0
  784.     beq.s    .End    ;sanity check
  785.     bra.s    .SkipMatch
  786. .Match:
  787.     move.l    4(a1),a0
  788. .SkipMatch:
  789.     SYS    ActivateWindow
  790. .End:    movem.l    (sp)+,d0-d1/a0-a1/a6
  791.     bsr    FreeSemaphore
  792.     rts
  793.  
  794. ;***************************************************************************
  795. ;Start of input handler code
  796. ;***************************************************************************
  797.  
  798. ;Get window associated with current mouse position.
  799. ;Returns Window in D0 and screen in D1.
  800.  
  801. GetWindow:
  802.     movem.l    d2-d4/a0-a1/a4-a6,-(sp)
  803.     move.l    GlobalPtr(pc),a5
  804.     move.l    LayersBase(a5),a6
  805.     move.l    IntBase(a5),a4
  806.     move.l    ib_FirstScreen(a4),d4
  807. .ScLoop:    tst.l    d4
  808.     beq.s    .ErrEnd
  809.     move.l    d4,a0
  810.     move.l    sc_NextScreen(a0),d4
  811.     move.w    ib_MouseX(a4),d0
  812.     move.w    ib_MouseY(a4),d1
  813.     move.w    sc_ViewPort+vp_Modes(a0),d2
  814.     move.w    d2,d3
  815.     and.w    #V_LACE,d2    ;interlace?
  816.     bne.s    .Lace    ;yes
  817.     lsr.w    #1,d1
  818. .Lace:    and.w    #V_HIRES,d3    ;hires?
  819.     bne.s    .Hires    ;yes
  820.     lsr.w    #1,d0
  821. .Hires:    sub.w    sc_ViewPort+vp_DxOffset(a0),d0
  822.     bmi.s    .ScLoop
  823.     sub.w    sc_ViewPort+vp_DyOffset(a0),d1
  824.     bmi.s    .ScLoop
  825.     push    a0
  826.     lea    sc_LayerInfo(a0),a0
  827.     SYS    WhichLayer
  828.     pop    d1
  829.     tst.l    d0
  830.     beq.s    .End
  831.     move.l    d0,a0
  832.     move.l    lr_Window(a0),d0
  833. .End:    movem.l    (sp)+,d2-d4/a0-a1/a4-a6
  834.     rts
  835. .ErrEnd:    moveq    #0,d0
  836.     moveq    #0,d1
  837.     bra    .End
  838.  
  839. DoWindowToFront:
  840.  
  841. ;Perform a WindowToFront on the window in D0.
  842. ;Enter with global ptr in A1.
  843.  
  844.     tst.l    d0
  845.     beq.s    .End1
  846.     movem.l    d0-d1/a0-a1/a6,-(sp)
  847.     move.l    IntBase(a1),a6
  848.     move.l    d0,a0
  849.     move.l    wd_WLayer(a0),a1
  850.     move.l    a1,d0
  851.     beq.s    .End
  852.     move.l    lr_ClipRect(a1),a1
  853.     move.l    a1,d0
  854.     beq.s    .End
  855.     tst.l    (a1)
  856.     beq.s    .End
  857.     move.l    wd_Flags(a0),d0
  858.     and.l    #WFLG_BACKDROP,d0
  859.     bne.s    .End
  860.     SYS    WindowToFront
  861. .End:    movem.l    (sp)+,d0-d1/a0-a1/a6
  862. .End1:    rts
  863.  
  864. BlankMouse:
  865.     movem.l    d0-d3/a0-a1/a5-a6,-(sp)
  866.     move.l    GlobalPtr(pc),a5
  867.     move.l    IntBase(a5),a6
  868.     move.l    ib_ActiveWindow(a6),d0
  869.     beq.s    .End
  870.     cmp.l    MBlankWindow(a5),d0
  871.     beq.s    .End
  872.     move.l    d0,MBlankWindow(a5)
  873.     move.l    d0,a0
  874.     move.l    ChipData(a5),a1
  875. ;    lea    ZeroMouse(a1),a1    ;not needed
  876.     moveq    #1,d0    ;height
  877.     moveq    #16,d1    ;width
  878.     moveq    #0,d2    ;xoffset
  879.     moveq    #0,d3    ;yoffset
  880.     pea    .End(pc)
  881.     move.l    OldSetPointer(a5),-(sp)
  882.     rts
  883. .End:    movem.l    (sp)+,d0-d3/a0-a1/a5-a6
  884.     rts
  885.  
  886. RestoreMouse:
  887.     movem.l    d0-d1/a0-a2/a5-a6,-(sp)
  888.     move.l    GlobalPtr(pc),a5
  889.     move.l    IntBase(a5),a6
  890.     tst.l    MBlankWindow(a5)
  891.     beq.s    .End
  892.  
  893. ;Look for window in pointer table. If present, do a SetPointer to restore
  894. ;the custom pointer. Otherwise call ClearPointer.
  895.  
  896.     move.l    MBlankWindow(a5),a0
  897.     clr.l    MBlankWindow(a5)
  898.     lea    PointerList(a5),a1
  899.     moveq    #POINTERLISTSIZE-1,d0
  900. .WinLoop:    cmp.l    pt_Window(a1),a0
  901.     beq.s    .Found
  902.     lea    pt_Sizeof(a1),a1
  903.     dbra    d0,.WinLoop
  904.     pea    .End(pc)
  905.     move.l    OldClearPointer(a5),-(sp)
  906.     rts
  907. .End:    movem.l    (sp)+,d0-d1/a0-a2/a5-a6
  908.     rts
  909. .Found:    move.l    a1,a2
  910.     movem.l    (a2),d0-d3/a0-a1
  911.     pea    .End(pc)
  912.     move.l    OldSetPointer(a5),-(sp)
  913.     rts
  914.  
  915. RestoreScreen:
  916.     push    a5
  917.     move.l    GlobalPtr(pc),a5
  918.     bclr    #STB_SBlanked,Status(a5)
  919.     beq.s    .End
  920.     move.w    #DMAF_SETCLR+DMAF_COPPER+DMAF_RASTER,dmacon+_custom
  921. .End:    pop    a5
  922.     rts
  923.  
  924. SigTask:
  925. ;Enter with GlobalPtr in A1 and signal in D0.
  926.     movem.l    d0-d1/a0-a1/a6,-(sp)
  927.     move.l    Task(a1),a1
  928.     move.l    4,a6
  929.     SYS    Signal
  930.     movem.l    (sp)+,d0-d1/a0-a1/a6
  931.     rts
  932.  
  933. IntRoutine:
  934.     bsr    GetSemaphore
  935.     move.l    a0,-(sp)
  936.     tst.l    FlickerOption(a1)
  937.     beq.s    .SkipFlick
  938.     move.l    GraphBase(a1),a0
  939.     move.l    gb_copinit(a0),a0
  940.     cmp.w    #color,Sysbackground-2(a0)
  941.     bne.s    .DefColor
  942.     move.w    SysBackground(a0),d0
  943.     move.l    RealBackground(a1),a0
  944.     move.w    d0,(a0)
  945.     bra.s    .SkipColor
  946. .DefColor:
  947.     move.l    RealBackground(a1),a0
  948.     move.w    #DefColor,(a0)
  949. .SkipColor:
  950.     move.l    (sp),a0
  951. .SkipFlick:
  952.  
  953. ;Perform SunMouse
  954.     tst.l    SunMouseOption(a1)
  955.     beq.s    .SkipSunMouse1
  956.     cmp.b    #IECLASS_RAWMOUSE,ie_Class(a0)
  957.     beq.s    .SkipSunMouse1
  958.     bclr    #STB_SunMouse,Status(a1)
  959.     beq.s    .SkipSunMouse1
  960.     bsr    GetWindow
  961.     movem.l    a0-a1/a6,-(sp)
  962.     move.l    IntBase(a1),a6
  963.     move.l    d0,a0
  964.     cmp.l    ib_ActiveWindow(a6),a0
  965.     beq.s    .EndSun
  966.     SYS    ActivateWindow
  967. .EndSun:    movem.l    (sp)+,a0-a1/a6
  968. .SkipSunMouse1:
  969.  
  970.     move.l    MBlankWindow(a1),d0
  971.     beq.s    .Loop
  972.     push    a6
  973.     move.l    IntBase(a1),a6
  974.     cmp.l    ib_ActiveWindow(a6),d0
  975.     beq.s    .EndMBW
  976.     bsr    RestoreMouse
  977.     bsr    BlankMouse
  978. .EndMBW:    pop    a6
  979.  
  980. .Loop:    cmp.b    #IECLASS_TIMER,ie_Class(a0)
  981.     beq    .Next
  982.  
  983. ;Reset screen blank
  984.     tst.l    SBlankOption(a1)
  985.     beq.s    .SkipSRestore
  986.     move.l    ie_TimeStamp(a0),ScreenTime(a1)
  987.     bsr    RestoreScreen
  988. .SkipSRestore:
  989.  
  990.     cmp.b    #IECLASS_RAWKEY,ie_Class(a0)
  991.     bne    .NotKey
  992.  
  993. ;Do Northgate keyboard mapping.
  994.     tst.l    NorthGateOption(a1)
  995.     beq.s    .SkipNorthgate
  996.     push    a2
  997.     lea    NorthgateTable(pc),a2
  998.     move.w    ie_Code(a0),d0
  999.     bclr    #7,d0
  1000. .NorthgateLoop:
  1001.     move.b    (a2),d1
  1002.     beq.s    .EndNorthgate
  1003.     addq.l    #3,a2
  1004.     cmp.b    d0,d1
  1005.     bne.s    .NorthgateLoop
  1006.     and.w    #$80,ie_Code(a0)
  1007.     move.b    -2(a2),d0
  1008.     or.b    d0,ie_Code+1(a0)
  1009.     move.b    -1(a2),d0
  1010.     bmi.s    .EndNorthgate
  1011.     bset    d0,ie_Qualifier+1(a0)
  1012. .EndNorthgate:
  1013.     pop    a2
  1014. .SkipNorthgate:
  1015.  
  1016. ;Blank mouse pointer
  1017.     tst.l    MBlankOption(a1)
  1018.     beq.s    .NoMBlank
  1019.     bsr    BlankMouse
  1020. .NoMBlank:
  1021.  
  1022.     btst    #IEQUALIFIERB_LCOMMAND,ie_Qualifier+1(a0)
  1023.     beq    .Next
  1024.     cmp.w    #$37,ie_Code(a0)    ;'m'?
  1025.     bne.s    .NotM
  1026.  
  1027. ;We found an Amiga-M. Defuse and perform action.
  1028.     clr.b    ie_Class(a0)
  1029.     push    a6
  1030.     move.l    IntBase(a1),a6
  1031.     move.l    ib_FirstScreen(a6),a0
  1032.     move.l    a0,d0
  1033.     beq    .EndM    ;sanity check
  1034.     move.l    a0,ScreenPtr(a1)
  1035.     move.l    ScreenToBackSig(a1),d0
  1036.     bsr    SigTask
  1037. .EndM:    pop    a6
  1038.     bra    .End
  1039. .NotM:
  1040.     cmp.w    #$36,ie_Code(a0)    ;'n'?
  1041.     bne.s    .NotN
  1042.  
  1043. ;We found an Amiga-N. Defuse and perform action.
  1044.     clr.b    ie_Class(a0)
  1045.     move.l    WBenchToFrontSig(a1),d0
  1046.     bsr    SigTask
  1047.     bra    .End
  1048. .NotN:
  1049.     tst.l    CmdOption(a1)
  1050.     beq    .Next
  1051.     cmp.w    #$45,ie_Code(a0)    ;ESC?
  1052.     bne    .Next
  1053.     clr.b    ie_Class(a0)
  1054.     move.l    CLISig(a1),d0
  1055.     bsr    SigTask
  1056.     bra    .End
  1057. .NotKey:
  1058.     cmp.b    #IECLASS_RAWMOUSE,ie_Class(a0)
  1059.     bne    .Next
  1060.     tst.l    MBlankOption(a1)
  1061.     beq.s    .NoRestore
  1062.     move.l    ie_TimeStamp(a0),MouseTime(a1)
  1063.     bsr    RestoreMouse
  1064. .NoRestore:
  1065.  
  1066. ;Perform SunMouse
  1067.     tst.l    SunMouseOption(a1)
  1068.     beq.s    .SkipSunMouse
  1069.     move.w    ie_Qualifier(a0),d0
  1070.     and.w    #IEQUALIFIER_LEFTBUTTON+IEQUALIFIER_RBUTTON+IEQUALIFIER_MIDBUTTON,d0
  1071.     bne.s    .SkipSunMouse
  1072.     cmp.w    #IECODE_LBUTTON+IECODE_UP_PREFIX,ie_Code(a0)
  1073.     beq.s    .SkipSunMouse
  1074.     bset    #STB_SunMouse,Status(a1)
  1075. .SkipSunMouse:
  1076.  
  1077. ;Perform click-to-back.
  1078.     tst.l    CTBOption(a1)
  1079.     beq.s    .NoCTB
  1080.     cmp.w    #IECODE_RBUTTON,ie_Code(a0)
  1081.     bne.s    .NoCTB
  1082.     move.w    ie_Qualifier(a0),d0
  1083.     btst    #IEQUALIFIERB_LEFTBUTTON,d0
  1084.     beq.s    .NoCTB
  1085.  
  1086.     movem.l    d2/a0-a1/a6,-(sp)
  1087.     move.l    IntBase(a1),a6
  1088.     bsr    GetWindow
  1089.     tst.l    d0
  1090.     beq.s    .FlipScreen
  1091.     move.l    d0,a1
  1092.     move.l    wd_Flags(a1),d2
  1093.     and.l    #WFLG_BACKDROP,d2
  1094.     bne.s    .FlipScreen
  1095.  
  1096. ;Is this the only window on this screen, except for backdrop windows?
  1097.     move.l    wd_WScreen(a1),a1
  1098.     move.l    sc_FirstWindow(a1),a1
  1099. .BackLoop:
  1100.     cmp.l    a1,d0
  1101.     beq.s    .EBackLoop
  1102.     move.l    wd_Flags(a1),d2
  1103.     and.l    #WFLG_BACKDROP,d2
  1104.     beq.s    .FlipWindow
  1105. .EBackLoop:
  1106.     move.l    (a1),a1
  1107.     move.l    a1,d2
  1108.     bne    .BackLoop
  1109. .FlipScreen:
  1110.     tst.l    d1
  1111.     beq.s    .ECTB
  1112.     move.l    GlobalPtr(pc),a1
  1113.     move.l    d1,ScreenPtr(a1)
  1114.     move.l    ScreenToBackSig(a1),d0
  1115.     bsr    SigTask
  1116.     bra.s    .ECTB
  1117. .FlipWindow:
  1118.     move.l    d0,a0
  1119.     SYS    WindowToBack
  1120.  
  1121. .ECTB:    movem.l    (sp)+,d2/a0-a1/a6
  1122.     clr.b    ie_Class(a0)
  1123.     bra    .Next
  1124. .NoCTB:
  1125.  
  1126. ;Perform click-to-front.
  1127.     tst.l    CTFOption(a1)
  1128.     beq    .NoCTF
  1129.     cmp.w    #IECODE_LBUTTON,ie_Code(a0)
  1130.     bne    .NoCTF
  1131.     bsr    GetWindow
  1132.     tst.l    d0
  1133.     beq    .NoCTF
  1134.     push    a2
  1135.     move.l    CTFOption(a1),a2
  1136.     move.l    (a2),d1
  1137.     pop    a2
  1138.     cmp.l    #1,d1
  1139.     bhi.s    .MoreThanOne
  1140.     bsr    DoWindowToFront
  1141.     bra.s    .NoCTF
  1142. .MoreThanOne:
  1143.     cmp.l    ClickWindow(a1),d0
  1144.     beq.s    .SameWindow
  1145.     move.l    d0,ClickWindow(a1)
  1146.     moveq    #1,d0
  1147.     move.l    d0,ClickCount(a1)
  1148. .Time:    move.l    ie_TimeStamp+TV_SECS(a0),ClickTime+TV_SECS(a1)
  1149.     move.l    ie_TimeStamp+TV_MICRO(a0),ClickTime+TV_MICRO(a1)
  1150.     bra.s    .NoCTF
  1151. .SameWindow:
  1152.  
  1153. ;Check to see whether MaxClickDelay has been exceeded. If not, increment
  1154. ;ClickCount and compare with (CTFOption). If equal, do a WindowToFront.
  1155. ;Window under pointer in D0.
  1156.  
  1157.     push    d0
  1158.     movem.l    d2-d3/a0-a1/a6,-(sp)
  1159.     move.l    ClickTime+TV_SECS(a1),d0
  1160.     move.l    ClickTime+TV_MICRO(a1),d1
  1161.     move.l    ie_TimeStamp+TV_SECS(a0),d2
  1162.     move.l    ie_TimeStamp+TV_MICRO(a0),d3
  1163.     move.l    IntBase(a1),a6
  1164.     SYS    DoubleClick
  1165.     movem.l    (sp)+,d2-d3/a0-a1/a6
  1166.     tst.l    d0
  1167.     beq.s    .TimeExceeded
  1168.     addq.l    #1,ClickCount(a1)
  1169.     push    a0
  1170.     move.l    CTFOption(a1),a0
  1171.     move.l    (a0),d0
  1172.     pop    a0
  1173.     cmp.l    ClickCount(a1),d0
  1174.     bhi.s    .NeedMoreClicks
  1175.     clr.l    ClickCount(a1)
  1176.     pop    d0
  1177.     bsr    DoWindowToFront
  1178.     bra.s    .NoCTF
  1179. .TimeExceeded:
  1180.     moveq    #1,d0
  1181.     move.l    d0,ClickCount(a1)
  1182. .NeedMoreClicks:
  1183.     pop    d0
  1184.     bra    .Time
  1185. .NoCTF:
  1186.  
  1187. ;Perform acceleration.
  1188.     tst.l    AccelOption(a1)
  1189.     beq.s    .Next
  1190.  
  1191.     push    a2
  1192.     moveq    #0,d0
  1193.     tst.l    ThreshOption(a1)
  1194.     beq.s    .T1
  1195.     move.l    ThreshOption(a1),a2
  1196.     move.l    (a2),d0
  1197. .T1:    move.w    ie_X(a0),d1
  1198.     bpl.s    .PosX
  1199.     neg.w    d1
  1200. .PosX:    cmp.w    d0,d1
  1201.     bls.s    .SkipX    ;below threshold
  1202.     move.l    AccelOption(a1),a2
  1203.     move.l    (a2),d1
  1204.     muls.w    ie_X(a0),d1
  1205.     bpl.s    .SubDampX
  1206.     add.w    DampingConstant(a1),d1
  1207.     bra.s    .DampX
  1208. .SubDampX:
  1209.     sub.w    DampingConstant(a1),d1
  1210. .DampX:    move.w    d1,ie_X(a0)
  1211. .SkipX:    move.w    ie_Y(a0),d1
  1212.     bpl.s    .PosY
  1213.     neg.w    d1
  1214. .PosY:    cmp.w    d0,d1
  1215.     bls.s    .EndAccel
  1216.     move.l    AccelOption(a1),a2
  1217.     move.l    (a2),d1
  1218.     muls.w    ie_Y(a0),d1
  1219.     bpl.s    .SubDampY
  1220.     add.w    DampingConstant(a1),d1
  1221.     bra.s    .DampY
  1222. .SubDampY:
  1223.     sub.w    DampingConstant(a1),d1
  1224.  
  1225. .DampY:    move.w    d1,ie_Y(a0)
  1226. .EndAccel:
  1227.     pop    a2
  1228.  
  1229. .Next:    move.l    a0,d1
  1230.     move.l    (a0),d0
  1231.     move.l    d0,a0
  1232.     bne    .Loop
  1233.  
  1234. ;Check for time-outs (mouse and screen blanking)
  1235.     move.l    d1,a0
  1236.     tst.l    MBlankOption(a1)
  1237.     beq.s    .NoMTime
  1238.     move.l    MBlankOption(a1),a0
  1239.     move.l    (a0),d0    ;get value in seconds
  1240.     move.l    d1,a0
  1241.     move.l    ie_TimeStamp(a0),d1
  1242.     tst.l    MouseTime(a1)
  1243.     beq.s    .InitMBlank
  1244.     sub.l    MouseTime(a1),d1
  1245.     cmp.l    d0,d1    ;TimePassed ? UserSetting
  1246.     blo.s    .NoMTime
  1247.     bsr    BlankMouse
  1248. .NoMTime:
  1249.     tst.l    SBlankOption(a1)
  1250.     beq.s    .End
  1251.     btst    #STB_SBlanked,Status(a1)
  1252.     bne.s    .End
  1253.     push    a0
  1254.     move.l    SBlankOption(a1),a0
  1255.     move.l    (a0),d0    ;get value in seconds
  1256.     pop    a0
  1257.     move.l    ie_TimeStamp(a0),d1
  1258.     tst.l    ScreenTime(a1)
  1259.     beq.s    .InitSBlank
  1260.     sub.l    ScreenTime(a1),d1
  1261.     cmp.l    d0,d1    ;TimePassed ? UserSetting
  1262.     blo.s    .End
  1263.     move.w    #DMAF_COPPER+DMAF_RASTER,dmacon+_custom
  1264.     clr.w    color+_custom
  1265.     bset    #STB_SBlanked,Status(a1)
  1266.  
  1267. .End:    move.l    (sp)+,d0
  1268.     bsr    FreeSemaphore
  1269.     rts
  1270. .InitMBlank:
  1271.     move.l    ie_TimeStamp(a0),MouseTime(a1)
  1272.     bra    .NoMTime
  1273. .InitSBlank:
  1274.     move.l    ie_TimeStamp(a0),ScreenTime(a1)
  1275.     bra    .End
  1276.  
  1277. GlobalPtr:
  1278.     dc.l    0
  1279.  
  1280. NorthgateTable:
  1281.     dc.b    $6b,$4f,IEQUALIFIERB_LSHIFT
  1282.     dc.b    $6c,$4e,IEQUALIFIERB_LSHIFT
  1283.     dc.b    $6d,$4c,IEQUALIFIERB_LSHIFT
  1284.     dc.b    $6e,$4d,IEQUALIFIERB_LSHIFT
  1285.     dc.b    0
  1286.  
  1287. ProcName:    dc.b    'QMouse process',0
  1288. InputName:
  1289.     dc.b    'input.device',0
  1290.     even
  1291.  
  1292. EndAllocCode:    ;end of code copied into allocated memory
  1293. ;***********************************************************************
  1294.  
  1295. NewProcTags:
  1296.     dc.l    NP_Entry
  1297. EntryPoint:
  1298.     dc.l    0
  1299.     dc.l    NP_Name
  1300. ProcNamePtr:
  1301.     dc.l    0
  1302.     dc.l    NP_Cli,-1
  1303.     dc.l    0    ;end of tags
  1304.  
  1305. Template:    dc.b    'M=MBLANK/K/N,'
  1306.     dc.b    'S=SBLANK/K/N,'
  1307.     dc.b    'N=NOFLICKER/S,'
  1308.     dc.b    'CMD/K,'
  1309.     dc.b    'A=ACCELERATION/K/N,'
  1310.     dc.b    'T=THRESHOLD/K/N,'
  1311.     dc.b    'CTB=CLICKTOBACK/S,'
  1312.     dc.b    'CTF=CLICKTOFRONT/K/N,'
  1313.     dc.b    'SUNMOUSE/S,'
  1314.     dc.b    'NORTHGATE/S,'
  1315.     dc.b    'NOBEEP/S,'
  1316.     dc.b    'QUIT/S',0
  1317.  
  1318. IntName:    dc.b    'intuition.library',0
  1319. GraphName:
  1320.     dc.b    'graphics.library',0
  1321. DosName:    dc.b    'dos.library',0
  1322. LayersName:
  1323.     dc.b    'layers.library',0
  1324.  
  1325. ;The ordering here is special: data registers first, then address
  1326. ;registers, so that MOVEM may be used to save/restore the data.
  1327.  
  1328.     STRUCTURE    pt,0
  1329.     LONG    pt_Height
  1330.     LONG    pt_Width
  1331.     LONG    pt_XOffset
  1332.     LONG    pt_YOffset
  1333.     LONG    pt_Window
  1334.     LONG    pt_Pointer
  1335.     LABEL    pt_Sizeof
  1336.  
  1337. ResidentCodeSize    equ    EndAllocCode-StartAllocCode
  1338.  
  1339.     STRUCTURE    Data,0
  1340.     WORD    Nothing    ;to make zero special
  1341.     LONG    Task
  1342.     LONG    InputMsgPort
  1343.     LONG    InputIORequest
  1344.     STRUCT    InputInterrupt,IS_SIZE
  1345.     LONG    IntBase
  1346.     LONG    GraphBase
  1347.     LONG    LayersBase
  1348.     STRUCT    ScreenList,SCREENLISTSIZE*8
  1349.     STRUCT    PointerList,POINTERLISTSIZE*pt_Sizeof
  1350.     LONG    OldCloseScreen
  1351.     LONG    OldCloseWindow
  1352.     LONG    OldScreenToFront
  1353.     LONG    OldScreenToBack
  1354.     LONG    OldOpenScreen
  1355.     LONG    OldOpenScreenTagList
  1356.     LONG    OldWBenchToFront
  1357.     LONG    OldWBenchToBack
  1358.     LONG    OldLoadView
  1359.     LONG    OldSetPointer
  1360.     LONG    OldClearPointer
  1361.     LONG    OldDisplayBeep
  1362.     LONG    DosBase
  1363.     LONG    ArgPtr
  1364.     STRUCT    ResidentCode,ResidentCodeSize
  1365.     LONG    MouseTime    ;timeout for mouse blanking
  1366.     LONG    ScreenTime    ;for screen blanking
  1367.     LONG    MBlankWindow
  1368.     WORD    DampingConstant
  1369.     STRUCT    MySemaphore,SS_SIZE
  1370.     LONG    ClickWindow
  1371.     STRUCT    ClickTime,TV_SIZE
  1372.     LONG    ClickCount
  1373.     LONG    Path
  1374.     LONG    ChipData
  1375.     LONG    RealBackground
  1376.     LONG    OriginalCopInit
  1377.     LONG    ScreenPtr
  1378.  
  1379.     LABEL    Sigs
  1380.     LONG    CLISig
  1381.     LONG    QuitSig
  1382.     LONG    ScreenToBackSig
  1383.     LONG    WBenchToFrontSig
  1384.     LABEL    EndSigs
  1385.  
  1386.     LABEL    Options
  1387.     LONG    MBlankOption
  1388.     LONG    SBlankOption
  1389.     LONG    FlickerOption
  1390.     LONG    CmdOption
  1391.     LONG    AccelOption
  1392.     LONG    ThreshOption
  1393.     LONG    CTBOption
  1394.     LONG    CTFOption
  1395.     LONG    SunMouseOption
  1396.     LONG    NorthGateOption
  1397.     LONG    BeepOption
  1398.     LONG    QuitOption
  1399.  
  1400.     BYTE    HandlerInstalled
  1401.     BYTE    Status    ;various status bits (defined below)
  1402.     LABEL    Data_Sizeof
  1403.  
  1404. ;Bit definitions for Status
  1405.     BITDEF    ST,SBlanked,0
  1406.     BITDEF    ST,SunMouse,1
  1407.  
  1408. NumSigs    equ    (EndSigs-Sigs)/4
  1409.  
  1410.     STRUCTURE    CData,0
  1411.     STRUCT    ZeroMouse,12
  1412.     STRUCT    Copper,MaxCopperSize+4*4
  1413.     LABEL    CData_Sizeof
  1414.  
  1415.     end
  1416.